#pragma once

#include "TableColumn.h"
#include "SortFunction.h"
#include "ThreadSorter.h"


namespace qb{
	namespace ht{
		class TableUser;
		class SortThread;
		class Table;
		class SortBuffer;
		class TableSorter;
		class TaskCache;
		class TableSorter : public ThreadSorter{		// 单例模式
		protected:
			struct RowIndex{
				int		row, rid;
				static int Compare(const void* p1, const void* p2){
					return ((const RowIndex*)p1)->rid - ((const RowIndex*)p2)->rid;
				}
			};
			
            std::vector<RowIndex>	m_sequential_rows;	// 顺序读取行
			SortBuffer*				m_sort_buffer;		// 当前已经读到内存中的要排序的若干列的数据，整块内存
			int						m_comp_level;
			bool					m_sequential_mode;
            std::vector<INDEX>		m_indexes;
		public:
			static TableSorter& Get(){ static TableSorter ts; return ts; }
			TableSorter();
			~TableSorter();
			SortBuffer*	GetSortBuffer(){ return m_sort_buffer; }
			void SortColumns(Table* table, TableUser* user);
		protected:
			/*
				LoadSortColumns：将当前user的多重排序列和rid的数据读取出来作为一张表放在内存中
				rid放在开头，内存为 rid,排序列0，排序列1，排序列2，...
				PrepareTempBuffer：准备排序过程中用到的数据
				UpdateIndex：将排序好的row-->rid更新到user中
				*/
			void LoadSortColumns(Table* table, TableUser* user);
			bool PrepareTempBuffer(int nsize);
			virtual int CompareColumns(const void* pSortData1, const void* pSortData2);
			int CompareRecord(const INDEX& k1, const INDEX& k2);
		};
	}//namespace ht
}//namespace qb
